package com.woniuxy.factoryUtils;

import com.woniuxy.entity.Person;
import jdk.nashorn.internal.objects.annotations.Property;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/*
第四代工厂，直接就贴近我们的spring的底层实现原理了。
 */
public class BeanFactory {
    //有key有value我们可不可以把它存起来
    static Map<String,String> map = new HashMap<>();
    //静态代码块中，要读取配置文件，加载配置文件中的数据，然后创建出对象
    // 需求1 在系统启动的时候，加载配置文件中所有内容， `调用getBean方法，才创建对象`，并返回给我对应的实例。(懒汉式)
    static {
        //创建properties对象，来解析properties文件
        Properties properties = new Properties();
        //二阶段输入流通过上面来读取？
        InputStream resourceAsStream = ThirdFactory.class.getResourceAsStream("applicationContext.properties");
        String personName = "";
        try {
            //需要加载读取我们的配置文件
            properties.load(resourceAsStream);

            //从这里需要修改第三类工厂，加载配置文件以后，我们需要拿到所有的key和value
            Set<Object> keys = properties.keySet();
            Enumeration<Object> keys1 = properties.keys();
            while (keys1.hasMoreElements()) {
                System.out.println(keys1.nextElement());
            }
//            keys.stream().forEach(System.out::println);
//            Iterator<Object> iterator = keys.stream().iterator();
//            while (iterator.hasNext()) {
//                Object next = iterator.next();
//                System.out.println(next);
//
//            }
            for (Object key : keys) {
                //这里是value
                personName =  properties.getProperty(key+"");
                //把对应的k-v放入map集合中
                map.put(key+"",personName);
            }
//            personName = properties.getProperty("person");
            //通过从配置文件中拿到的全限定类类名 来创建对象
//            person = (Person) Class.forName(personName).newInstance();
//            resourceAsStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //需求1的调用getBean的时候创建对象啊

    /**
     * 此时是需求1，getBean的时候才创建对象
     * @param name 配置文件中的key
     * @return
     */
    public Object getBean(String name){
        String className = map.get(name);
        Object o = null;
        try {
            Class<?> aClass = Class.forName(className);
            o = aClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return o;
    }
}
